<?php

namespace app\api\logic;

use app\admin\model\user\UserCoupon;
use app\basic\BaseLogic;

class UserCouponLogic extends BaseLogic
{
    /**
     * 构造函数
     */
    public function __construct()
    {
        $this->model = new UserCoupon();
    }

    /**
     * 获取用户优惠券列表
     * @param int $userId 用户ID
     * @param int $status 状态：0=未使用 1=已使用 2=已过期，-1=全部
     * @return array
     */
    public function getUserCouponList($userId, $status = -1)
    {
        $query = $this->model->where('user_id', $userId);
        
        // 按状态筛选
        if ($status != -1) {
            $query->where('status', $status);
        } else {
            // 如果是全部，需要检查是否过期
            $this->checkExpiredCoupons($userId);
        }

        $list = $query->field('id, name, amount, min_price, start_time, end_time, status')
            ->order('status', 'asc')  // 未使用的排在前面
            ->order('end_time', 'asc')  // 快过期的排在前面
            ->select()
            ->each(function($item) {
                // 格式化时间
                $item['start_time'] = date('Y-m-d H:i:s', $item['start_time']);
                $item['end_time'] = date('Y-m-d H:i:s', $item['end_time']);
                $item['use_time'] = $item['use_time'] ? date('Y-m-d H:i:s', $item['use_time']) : '';
                // 添加状态文本
                $item['status_text'] = $this->getStatusText($item['status']);
                return $item;
            })
            ->toArray();

        return $list;
    }

    /**
     * 检查并更新过期优惠券
     * @param int $userId 用户ID
     */
    protected function checkExpiredCoupons($userId)
    {
        $this->model->where('user_id', $userId)
            ->where('status', 0)  // 未使用的
            ->where('end_time', '<', time())  // 已过期的
            ->update(['status' => 2]);  // 标记为已过期
    }

    /**
     * 获取状态文本
     * @param int $status 状态码
     * @return string
     */
    protected function getStatusText($status)
    {
        $statusMap = [
            0 => '未使用',
            1 => '已使用',
            2 => '已过期'
        ];
        return $statusMap[$status] ?? '未知状态';
    }
} 